/*
** 作者：TheBadZhang
** 创建时间：2003??
** 最后修改时间：看文件
** 文件名：image.h
** 用途：image 类，主要的图像处理玩意儿
*/
#ifndef ifImageIsDefine
#define ifImageIsDefine
#pragma once
// #pragma once
#include "paint.h"
namespace xege {


// 图像类
class IMAGE : /* protected IMAGE_BASE, */  public PAINT {
private:

	WINDOW& Window, *pWindow;

public:
	// 从文件加载图片，支持的文件格式如下，路径采用 UTF-8 编码（大概）
	// BMP, GIF, JPEG, LBM, PCX, PNG, PNM, SVG, TGA, TIFF, WEBP, XCF, XPM, XV
	void getImageFromFile (std::string path);
	// 从像素序列中获得图像
	void getImageFromPixels (uint w, uint h, color_t* pixels = nullptr);
	// 保存为 PPM 格式的图片
	void savePPM (std::string path);
	// 复制图片（基础）
	void copyImageB (IMAGE &pic);
public:
	// 更新图像（好像没有用的来着？）
	void update (void);
	// 从数据中读取像素信息，创建 IMAGE
	IMAGE (WINDOW &dstWindow, uint w, uint h, color_t* pixels = nullptr);
	// 从数据中读取像素信息，创建 IMAGE
	IMAGE (WINDOW* dstWindow, uint w, uint h, color_t* pixels = nullptr);
	// 从文件中获取图片
	IMAGE (WINDOW &dstWindow, std::string path);
	// 从文件中获取图片
	IMAGE (WINDOW* dstWindow, std::string path);
	// 从 surface 中获取图片
	IMAGE (WINDOW &dstWindow, SDL_Surface* src);
	// 从 surface 中获取图片
	IMAGE (WINDOW* dstWindow, SDL_Surface* src);
	// 从 IMAGE 中获取图片
	IMAGE (IMAGE &pic);
	// 从 IMAGE 中获取图片
	IMAGE (IMAGE* pic);
	// 从 WINDOW 中获取图片
	// IMAGE (WINDOW &dstWindow): Window (dstWindow), pWindow (&dstWindow) {
		
	// }
	// 从 renderer 中获取图片
	// 从 texture 中获取图片
	~IMAGE (void);
	// 设置目标窗口
	void setWindow (WINDOW &dstWindow);
	// 设置目标窗口
	void setWindow (WINDOW* dstWindow);
	// 获得窗口
	WINDOW &getWindow  (void);
	// 获得窗口
	WINDOW* getPWindow (void);
	
	// 从文件获取图片
	void getImage (std::string path);
	// void getImage (SDL_Renderer* renderer) {
	// 	void* pixels = new color_t [w*h];
	// 	SDL_RenderReadPixels(renderer, nullptr, SDL_PIXELFORMAT_RGBA8888, (void*)pixels, 32);
	// 	// getImageFromPixels (w, h, pixels);
	// 	SDL_Surface* p1 = SDL_CreateRGBSurfaceFrom((void*)pixels, w, h, 8, pitch, rmask, gmask, bmask, amask);
	// }
	// 从 surface 中获取图片
	void getImage (SDL_Surface* surface);
	// 从 IMAGE 中获取图片
	void getImage (IMAGE* pic);
	// 从 IMAGE 中获取图片
	void getImage (IMAGE &pic);
	// 从 IMAGE 中 copy 图片
	void copyImage (IMAGE &pic);
	// 从 IMAGE 中 copy 图片
	void copyImage (IMAGE* pic);

	// void copyImage (SDL_Surface* surface) {
	// 	getImageFromPixels (surface -> w, surface -> h);
	// 	SDL_BlitSurface (surface, nullptr, sPic, nullptr);
	// }
	// void copyImage (IMAGE* pic) {
	// 	getImageFromPixels (pic -> getSurface () -> w, pic -> getSurface () -> h);
	// 	SDL_BlitSurface (pic -> getSurface (), nullptr, sPic, nullptr);
	// }
	// void copyImage (IMAGE &pic) {
	// 	getImageFromPixels (pic.getSurface () -> w, pic.getSurface () -> h);
	// 	SDL_BlitSurface (pic.getSurface (), nullptr, sPic, nullptr);
	// }


	// 从一个 IMAGE 的部分复制到 Window 的部分
	void putImageScaled (int x = 0, int y = 0, int w = 0, int h = 0);
	// void putImageScaled (RECT dst = {0, 0, 0, 0}) {
	// 	SDL_BlitScaled (sPic, nullptr, Window.getSurface (), &dst);
	// }
	// 从一个 IMAGE 的部分复制到 Window 的部分
	void putImageScaled (RECT src = {0, 0, 0, 0}, RECT dst = {0, 0, 0, 0});
	// 从一个 IMAGE 的部分复制到 Window 的部分
	void putImage (int x = 0, int y = 0, int w = 0, int h = 0);
	// 从一个 IMAGE 的部分复制到 Window 的部分
	void putImage (RECT src = {0, 0, 0, 0}, RECT dst = {0, 0, 0, 0});
	// 从一个 IMAGE 的部分复制到另一个 surface 的部分
	void putImage (SDL_Surface* surface);
	// putimage_rotation
	// putimage_flip
	// putimage_
	void update2 (void);

	// 文件路径，文件格式，图像质量（仅 JPG 文件）
	// 路径推荐英文，没有试过中文会怎么样
	void saveImage (std::string filepath = "", IMAGETYPE type = PNG, int quality = 80);


};  // 类 IMAGE 结尾

typedef IMAGE* PIMAGE;

}  // 命名空间 xege 结尾
#endif